﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using CapaDeDatos.EF;
using CapaDeDominio;
using CapaDeDatos;

namespace CapaDePrueba
{

    [TestFixture]
    public class TestServicioDAO

    {
        private IServicioDAO servicioDAO = null; // Clase DAO que se va a probar
        private int codigoGenerado = 0; // Código de Local que se genera en Crear() y se utiliza para el resto de pruebas

        [TestFixtureSetUp]
        public void PrepararPruebas() 
        {
            servicioDAO = new CapaDeDatos.EF.ServicioDAO();
            servicioDAO.Crear(new Servicio { 
                Nombre="Grabacion",
                Descripcion="Tipo A",
                Alquiler=20
            });
            servicioDAO.Crear(new Servicio()
            {
                Nombre="Grabacion Acustica",
                Descripcion="Tipo A1",
                Alquiler=50
            });
        }

        [Test]
        public void Test1_Crear()
        {
            Assert.IsNotNull(servicioDAO);

            Servicio servicioAcrear = new Servicio();
            servicioAcrear.Nombre = "Jenny Marilu";
            servicioAcrear.Descripcion = "Roman";
            servicioAcrear.Alquiler = 35;
            // 3. Declaramos la entidad que contendrá el resultado
            Servicio servicioCreado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                servicioCreado = servicioDAO.Crear(servicioAcrear);
                codigoGenerado = servicioCreado.Codigo;
            }, "cliente creado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(servicioCreado);
            // Probamos que el código generado sea mayor a 0
            Assert.Greater(servicioCreado.Codigo, 0);
            // Probamos que los nombres registrado es igual al solicitado con la entidad
            Assert.AreEqual(servicioCreado.Nombre, servicioCreado.Nombre);
            // Probamos que el apellido registrado es igual a la solicitada con la entidad
            Assert.AreEqual(servicioCreado.Descripcion, servicioAcrear.Descripcion);
            // Probamos que el apellido registrado es igual a la solicitada con la entidad
            Assert.AreEqual(servicioCreado.Alquiler, servicioAcrear.Alquiler);
        }
        [Test]
        public void Test2_Obtener()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(servicioDAO);
            // 2. Definimos los datos para la prueba
            int codigo = codigoGenerado;
            // 3. Declaramos la entidad que contendrá el resultado
            Servicio servicioObtenido = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                servicioObtenido = servicioDAO.Obtener(codigo);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(servicioObtenido);
            Assert.AreEqual(servicioObtenido.Codigo, codigo);
            Assert.IsNotNullOrEmpty(servicioObtenido.Nombre);
            Assert.IsNotNullOrEmpty(servicioObtenido.Descripcion);
            Assert.IsNotNull(servicioObtenido.Alquiler);
        }
        [Test]
        public void Test5_ListarTodos()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(servicioDAO);
            // 2. Declaramos la entidad que contendrá el resultado
            ICollection<Servicio> ServcioEncontrados = null;
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                ServcioEncontrados = servicioDAO.ListarTodos();
            }, "clientes encontrados");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(ServcioEncontrados);
            // Probamos que la cantidad de locales encontrados sea 2
            Assert.AreEqual(ServcioEncontrados.Count, 2);
            // Probamos que cada local contenga la cadena de búsqueda en su nombre
            foreach (Servicio ServicioEncontrado in ServcioEncontrados)
            {
                Assert.IsNotNull(ServicioEncontrado);
                Assert.IsInstanceOf(typeof(Servicio), ServicioEncontrado);
            }
        }
    }
}


